#include "sys.h"
#include "delay.h"
#include "cat1_1.h"
#include "cat1_2.h"
#include "cat1_app.h"
#include "key.h"
#include "rs485_1.h"
#include "rs485_2.h"
#include "wifi.h"
#include "crc.h"
#include "app_sysconfig.h"
#include "rtc.h"
#include "w25qxx.h" 
#include "sdio_sdcard.h"
#include "adc.h"
#include "factory.h"
#include "app_memory.h"
#include "platform.h"
#include "radio.h"
#include "sx1276-LoRa.h"
#include "sx1276-Hal.h"
#include "sx1276.h"
#include "sx1276-FskMisc.h"
#include "sx1276-Fsk.h"
#include <string.h>
#include "ring_queue.h"
#include "error_log.h"

#define SX1278_RX
#define BUFFER_SIZE     255                          // Define the payload size here
const u8 *COMPILED_DATE=__DATE__;//获取 编译日期
const u8 *COMPILED_TIME=__TIME__;//获取 编译时间

unsigned short RS485_1_BUFF_LEN=0; //字符接收长度
unsigned short RS485_2_BUFF_LEN=0; //字符接收长度

unsigned char RS485_2_buffer[RS485_2_LEN_MAX]={0};//RS485_2 缓存变量
unsigned char RS485_1_buffer[RS485_1_LEN_MAX]={0};//RS485_1 缓存变量

unsigned short CAT1_1_BUFF_LEN=0; //字符接收长度
unsigned  char CAT1_1_buffer[CAT_1_LEN_MAX]={0};

unsigned short CAT1_2_BUFF_LEN=0; //字符接收长度
unsigned char CAT1_2_buffer[CAT_2_LEN_MAX]={0};
unsigned char time_10s_flag=0;
unsigned int lora_reset_time=0;
unsigned int lora_queue=0;
unsigned short lora_buf[24]={0};
SYSTEM_QIXIANG QIXIANG_struct;

RTC_TimeTypeDef RTC_TimeStruct;  //全局变量时间
RTC_DateTypeDef RTC_DateStruct;  //全局变量日期
SYSTEM_INFO SYSTEM_INFO_str;     //系统信息

unsigned char Module1_4G_CSQ=0;
unsigned char Module2_4G_CSQ=0;
tRadioDriver *Radio = NULL;
extern tLoRaSettings LoRaSettings;

unsigned char lora_rxbuf[128]={0};
unsigned char key_enable=0;
extern u16 frame_num;//帧标号
u32 rx_timeout_num=0;//接收超时计数
uint16_t BufferSize = BUFFER_SIZE;	// RF buffer size
uint8_t  Buffer[BUFFER_SIZE];				// RF buffer
uint32_t sta=0;
RingQueue_t RingQueue_t_data;
RingQueue_data RingQueue_readbuf[MAX_QUEUE_LEN];

SYS_TIME_FLAG SYS_TIME_FLAG_str;  //第一路 4G 模块 定时器 标志位
SYS_TIME_FLAG SYS_TIME_FLAG_str1; //第二路 4G 模块 定时器 标志位

SYS_EXT_FLAG  SYS_EXT_FLAG_str;   //第一路 4G 模块 系统运行时间、流量记录
SYS_EXT_FLAG  SYS_EXT_FLAG_str1;  //第二路 4G 模块 系统运行时间、流量记录

SYS_NET_FLAG  SYS_NET_FLAG_cat1;
SYS_NET_FLAG  SYS_NET_FLAG_cat2;

float bat_v=0;  //电池电压值
int muc_temp=0; //mcu 温度
uint8_t sx_temp=0;
unsigned char SYS_PLAM_4G1='2'; //第一路 4G 模块 ，选择 协议方式 1--南网，2国网
unsigned char SYS_PLAM_4G2='2'; //第二路 4G 模块 ，选择 协议方式 1--南网，2国网
unsigned char gateway_id[17]={0}; //状态检测装置ID	
unsigned char software[4]={'1','0','0','0'}; //软件 版本
unsigned char cat1_1_Cardnum[20]={0};  // 卡号   字符串
unsigned char cat1_2_Cardnum[20]={0};  // 卡号   字符串

unsigned char cat1_1_ModuleID[15]={0}; // 模组id 字符串 
unsigned char cat1_2_ModuleID[15]={0}; // 模组id 字符串 unsigned char sram_memory[102400]={0};

//unsigned char sram_memory[102400]={0};

float server_bat_v=0;
float server_muc_temp=0;
//寄存器 0x0D：这个寄存器通常是用来配置 LoRa 模式下的带宽设置。将其值设置为 0 可能表示选择了默认的带宽设置。

//寄存器 0x10：一般用于配置 LoRa 模式下的扩频因子（Spreading Factor）。将其值设置为 10 可能表示选择了 Spreading Factor 为 10。

//寄存器 0x25：通常用于配置 LoRa 模式下的同步字（Sync Word）。将其值设置为 0x20 可能表示选择了特定的同步字节值。

//寄存器 0x13：用于配置 LoRa 模式下的信道参数。将其值设置为 0x10 可能表示选择了特定的信道参数设置。
void Add_lora_set(void)//启动 LoRa 模块的接收
{
    unsigned char  test_buf=0;
    
	  SX1276WriteBuffer(0X0D,&test_buf,1);
		test_buf=10;
		SX1276WriteBuffer(0x10,&test_buf,1);    
		test_buf= 0x20;	
		SX1276WriteBuffer(0x25 ,&test_buf,1);	
		test_buf= 0x10;
		SX1276WriteBuffer(0x13 ,&test_buf,1);			
	  Radio->StartRx();   //RFLR_STATE_RX_INIT 

}


unsigned char Check_crc32(unsigned char* buf)
{
    	unsigned long crc=0,real_crc=0;
 	    crc=crc32(crc,buf,12);
	    real_crc=(buf[12]<<24)+(buf[13]<<16)+(buf[14]<<8)+buf[15];
	    if(real_crc==crc)
			{
			  // printf(" crc32 check OK\r\n");
				 return 1;
			}
	    else
			{
			   //printf(" crc32 check error\r\n");
				 return 0;
			}
}
void Run_lora_task(void)
{
	unsigned short i=0;  
	unsigned short lora_dp=0,lora_value=0;
  //printf(" -----------run   lora    task-------------\r\n ");
    while(Radio->Process( ) == RF_RX_DONE)//一旦接收到信息,则显示出来.
	{			
		// 16 byte
		// 4byte      1byte     1byte    2byte 
		// id         cmd       len      temp
		Radio->GetRxPacket( Buffer, ( uint16_t* )&BufferSize );		
		//LOG_PRINT("lora buf size:%d\n",BufferSize);	
		//LOG_PRINT("LoRa RX:");		
		//for(i=0;i<BufferSize;i++)
		//{			
		//	printf("%x ",Buffer[i]);			
		//}	
		//printf("\n");
		if( strlen(Buffer) != 0 )
		{
			Buffer[strlen(Buffer)]=0;//加入字符串结束符
		/*LOG_PRINT("LoRa RX:");		
			for(i=0;i<16;i++)
			{			
				printf("%x ",Buffer[i]);			
			}	*/
			if((Buffer[0]==0x42)&&(Buffer[1]==0x57)&&(Check_crc32(Buffer)==1))
			{
				lora_dp=(Buffer[2]<<8)+Buffer[3];	
				lora_value =	(Buffer[6]<<8)+Buffer[7];		
									
				LOG_PRINT("lora id :%d\r\n",lora_dp);		
				LOG_PRINT("lora value :%d\r\n",lora_value-2731);						
				for(i=0;i<MAX_QUEUE_LEN;i++)
				{
					
					if((lora_dp==RingQueue_readbuf[i].device_id)&&(lora_value<4731))
					{
							RingQueue_readbuf[i].device_value=(Buffer[6]<<8)+Buffer[7];
							RingQueue_readbuf[i].device_volt=(Buffer[8]<<8)+Buffer[9];
							RingQueue_readbuf[i].device_flag=1;
							RingQueue_readbuf[i].device_flag1=1;
							LOG_PRINT("get lora id:%d   lora value :%d\r\n",lora_dp,lora_value-2731);
							LOG_PRINT("LoRa RX:");		
							for(i=0;i<BufferSize;i++)
							{			
								printf("%x ",Buffer[i]);			
							}	

					}


				}								
			
			}
			else
			{
				LOG_PRINT("lora data  error!\r\n");	
			}						
			memset(Buffer,0,BUFFER_SIZE);
				
		}
		
		Radio->StartRx( );					
	} 
}

int main(void)
{ 
	unsigned short i=0;  
	unsigned char sd_test_buf[10]={0};
	SCB->VTOR = FLASH_BASE | 0x10000;//设置偏移量
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	//delay_init(168);	//延时初始化 
	delay_init(42);		  //延时初始化 
	Board_Init();       //硬件初始化
	delay_ms(1000);
	
	for(i=0;i<500;i++)  //等待 5S ，长按 进入 工厂 模式
	{
		Run_factory_App();
		if(key_enable==1) break;
	}
	Radio = RadioDriverInit();
	Radio->Init();		
	Add_lora_set(); 
	RingQueueInit(&RingQueue_t_data);
	Read_Record_time_flow();
	//TIM3_Int_Init(5000-1,8400-1);	//定时器时钟84M，分频系数8400，所以84M/8400=10Khz的计数频率，计数5000次为500ms ---168M 
	//TIM3_Int_Init(10000-1,8400-1);	//定时器时钟84M，分频系数8400，所以84M/8400=10Khz的计数频率，计数10000次为1000ms  ---168M
	TIM3_Int_Init(2500-1,8400-1);          

	printf(" -----------Task start up-------------\r\n ");

	bat_v=Get_Bat_VOL();  //电池电压值	  
	muc_temp=	Get_Temprate(); //mcu 温度 		
	server_muc_temp=server_muc_temp*10.0;  //温度转换 	
	IWDG_Init(4,3000); //与分频数为64,重载值为1500,溢出时间为3s	

	while(1)
	{			
		//printf("test log 6/3\n");
		//IWDG_Feed();//喂狗	    
		Run_lora_task();	  	                  //Lora 定时 采集温度数据
		//Run_qixiang();
		if(SYS_TIME_FLAG_str.sys_work_flag==1)  //定时 记录 系统运行数据
		{			    
			SYS_TIME_FLAG_str.sys_work_flag=0;	
			Add_sys_time(1);
			Add_continue_time(1);		
			Add_sys_time1(1);
			Add_continue_time1(1);					
			Save_sys_time_Flow();				
		}
		if(SYS_TIME_FLAG_str.time_read_qx_flag==1) //定时采集 气象数据
		{
			SYS_TIME_FLAG_str.time_read_qx_flag=0;
			Run_qixiang();
			bat_v=Get_Bat_VOL();  //电池电压值	 
			muc_temp=	Get_Temprate(); //mcu 温度 		
			server_muc_temp=server_muc_temp*10.0;  //温度转换 	
			LOG_PRINT("bat_v=%f\r\n",bat_v);
			LOG_PRINT("muc_temp=%d\r\n",muc_temp);
			//          printf("server_muc_temp=%f\r\n",server_muc_temp);
			if(bat_v>10){error_data[BAT_ERR_LIST]=0;}
			else {error_data[BAT_ERR_LIST]=1;}
			if(muc_temp<86||muc_temp>-41){error_data[BAT_ERR_LIST]=0;}
			else {error_data[BAT_ERR_LIST]=1;}

			//					if(SD_ReadDisk(sd_test_buf,0X10,1)==0)
			//					{
			//					    error_data[SD_ERR_LIST]=0;				
			//					}
			//					else
			//         {
			//				       error_data[SD_ERR_LIST]=1;			
			//				 }
			Check_Flash_Type();
			SX1276Read(0x06,&sx_temp);
			printf("sx_temp=%x\r\n",sx_temp);
			if(sx_temp != 0x7C)
			{
				printf("Hard SPI Err!\r\n");
				
			error_data[LORA_ERR_LIST]=1;
			}
			else
			{
			error_data[LORA_ERR_LIST]=0;
			}
                     						
			}
//      SX1276Read(0x06,&sx_temp);
//      printf("sx_temp=%x\r\n",sx_temp);
			cat1_ch2_net_process();
			//CAT1_Sign_Net_CH2();  //4G 模块2 任务
			CAT1_Sign_Net();		  //4G 模块1 任务
			delay_ms(30);
      		My_go_lowpower();	
			if(lora_reset_time>86400)//定时 硬件复位
			{
			    lora_reset_time=0;
				Radio = RadioDriverInit();
				Radio->Init();		
				Add_lora_set(); 
				RingQueueInit(&RingQueue_t_data);
				  
			}
			if(Change_err_sta()==1)// 状态 变化，主动上报
			{
          
			    if(Check_net_conn()==1) //设备在线
				{
					GPIO_ResetBits(GPIOA,GPIO_Pin_12);
						delay_ms(100);
					Send_CAT1_1_LOG_ERR();
					GPIO_SetBits(GPIOA,GPIO_Pin_12);
					delay_ms(10);						
				}
//			    delay_ms(50);
//          
//					if(Check_net_conn_CH2()==1) //设备在线
//					{
//           
//					    Send_CAT1_2_LOG_ERR();
//					}
			}
     		
	}
}

